package es.ikex.dao;

import java.sql.SQLException;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;

import es.ikex.modelo.Cliente;

public class UsuarioDAO extends ConexionDAO {
	
	private static final String INSERT_STATEMENT = 
		"insert into usuarios (usuario,clave,ultimoacceso,TipoAcceso) values(?,password(?),?,?);";
	private static final String UPDATE_STATEMENT = 
		"update usuarios set Usuario=?,Clave=password(?) where Codigo=?";
	
	public boolean getUsuario(String usuario){
		boolean existe = false;
		getConexion();
		try{
			estamento = conexion.createStatement();
			resultado =  estamento.executeQuery("select * from usuarios  where usuario='" + usuario + "'");
			if(resultado.next()){
				existe = true;
			}
		}catch(SQLException e){
			e.printStackTrace();
		}
		return existe;
	}
	
	public void crearUsuario(Cliente cliente) {
		try {
			getConexion();
			preparada = conexion.prepareStatement(INSERT_STATEMENT);
			preparada.setString(1, cliente.getUsuario());
			preparada.setString(2, cliente.getClave());
			Calendar calendario = GregorianCalendar.getInstance();
			java.util.Date fecha = calendario.getTime();
			SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy/MM/dd");
			preparada.setString(3, formatoDeFecha.format(fecha));
			preparada.setString(4, cliente.getTipoAcceso());
			preparada.executeUpdate();
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
	}

	public Collection<Cliente> leerUsuarioCliente(String clausulaWhere){
		Collection<Cliente> lista = new ArrayList<Cliente>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			resultado = estamento.executeQuery
				("select u.Codigo,u.Usuario,u.Clave,date_format(u.UltimoAcceso,'%d-%m-%Y') as fecha, " +
				"u.TipoAcceso,u.Bloqueado,c.Nombre,c.Apellido,c.NIF_NIE,c.Direccion,c.CodigoPostal, c.email," +
				"c.Telefono,date_format(c.FechaNacimiento,'%d-%m-%Y') as fechaNac," +
				"date_format(c.FechaIntro,'%d-%m-%Y') as fechaIntro from usuarios as u inner join " +
				"clientes c using(Codigo) " + clausulaWhere);
			while(resultado.next()){
				Cliente cliente = new Cliente();
				cliente.setCodigo(resultado.getInt("Codigo"));
				cliente.setUsuario(resultado.getString("Usuario"));
				cliente.setClave(resultado.getString("Clave"));
				cliente.setUltimoAcceso(resultado.getString("fecha"));
				cliente.setTipoAcceso(resultado.getString("TipoAcceso"));
				cliente.setBloqueado(resultado.getString("Bloqueado"));
				cliente.setNombre(resultado.getString("Nombre"));
				cliente.setApellidos(resultado.getString("Apellido"));
				cliente.setNifNie(resultado.getString("NIF_NIE"));
				cliente.setDireccion(resultado.getString("Direccion"));
				cliente.setCodigoPostal(resultado.getString("CodigoPostal"));
				cliente.setTelefono(resultado.getString("telefono"));
				cliente.setFechaNacimiento(resultado.getString("fechaNac"));
				cliente.setFechaIntro(resultado.getString("fechaIntro"));
				cliente.setCorreo(resultado.getString("email"));
				lista.add(cliente);
				actualizarFecha(resultado.getInt("Codigo"));
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
		
	}
	
	public void actualizarFecha(int codigo){
		try {
			preparada = conexion.prepareStatement("update usuarios set UltimoAcceso=? where Codigo=?");

			Calendar calendario = GregorianCalendar.getInstance();
			java.util.Date fecha = calendario.getTime();
			SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy/MM/dd");
			preparada.setString(1, formatoDeFecha.format(fecha));
			preparada.setInt(2, codigo);
			preparada.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void actualizarUsuario(Cliente cliente){
		try {
			getConexion();
			preparada = conexion.prepareStatement(UPDATE_STATEMENT);
			preparada.setString(1, cliente.getUsuario());
			preparada.setString(2, cliente.getClave());
			preparada.setInt(3, cliente.getCodigo());
			preparada.executeUpdate();
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
	}

	public Collection<Cliente> getUsuarios(String where){
		Collection<Cliente> lista = new ArrayList<Cliente>();
		try {
			getConexion();
			estamento = conexion.createStatement();
			resultado = estamento.executeQuery
				("select * from usuarios inner join clientes using(Codigo) " + where);
			while(resultado.next()){
				if(!resultado.getString("TipoAcceso").equals("SuperAdmin")){
					Cliente cliente = new Cliente();
					cliente.setCodigo(resultado.getInt("Codigo"));
					cliente.setUsuario(resultado.getString("Usuario"));
					cliente.setUltimoAcceso(resultado.getString("UltimoAcceso"));
					cliente.setTipoAcceso(resultado.getString("TipoAcceso"));
					cliente.setBloqueado(resultado.getString("Bloqueado"));
					cliente.setNombre(resultado.getString("Nombre"));
					cliente.setApellidos(resultado.getString("Apellido"));
					cliente.setNifNie(resultado.getString("NIF_NIE"));
					cliente.setDireccion(resultado.getString("Direccion"));
					cliente.setCodigoPostal(resultado.getString("CodigoPostal"));
					cliente.setTelefono(resultado.getString("telefono"));
					cliente.setFechaNacimiento(resultado.getString("FechaNacimiento"));
					cliente.setFechaIntro(resultado.getString("fechaIntro"));
					cliente.setCorreo(resultado.getString("email"));
					lista.add(cliente);
				}
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} finally {
			cerrar();
		}
		
		return lista;
	}
	
	public void cambiarBloqueo(int codigo, String bloqueo){
		
		try {
			getConexion();
			preparada = conexion.prepareStatement("update usuarios set Bloqueado=? where Codigo=?");
			
			preparada.setString(1, bloqueo);
			preparada.setInt(2, codigo);
			preparada.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			cerrar();
		}
	}


}
